/** ***********************************************************************************
* @file         net_port.h
* @brief        网络数据接口 头文件
* @details      主要用来接收网络通道的接口数据
* @author       杨小珛
* @date         2020/12/25
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/

#ifndef NET_PORT_H
#define NET_PORT_H

#include "os_app.h"

#define  NET_RUN_QUEUE_MAX_NUM              5
#define  NET_RUN_SAM_REV_WAIT_TIME          ( 5000 )
#define  NET_RUN_REV_DATA_BUF_SIZE          ( 1500 )

#define  MODULE_NET_OK     ( 1 )
#define  MODULE_NET_ERR    ( 2 )
#define  MODULE_NET_OPEN   ( 3 )
#define  MODULE_NET_RST    ( 4 )


#define  NET_MOD_CCID_LEN  ( 20 )
#define  NET_MOD_IMSI_LEN  ( 15 )
#define  NET_MOD_IMEI_LEN  ( 15 )
#define  NET_MOD_LOC_IP_LEN  ( 64 )
#define  NET_MOD_PDP_IP_LEN  ( 64 )

//网络模块运行状态 -------------------------------------------------------------
typedef struct
{
    volatile uint8_t   mod_state;  // 模块状态  0-模块为启动 1-模块OK 2-模块故障 3- 模块网络正常 4- 模块服务
    volatile uint8_t   sim_state;  // 0 SIM 卡不错在 1 SIM卡存在 
    volatile uint8_t   mod_ccid[NET_MOD_CCID_LEN];//模块的ICCID
    volatile uint8_t   mod_imsi[NET_MOD_IMSI_LEN]; //模块的IMSI
    volatile uint8_t   mod_imei[NET_MOD_IMEI_LEN]; //模块的IMEI
    volatile uint8_t   net_signal;  // 信号强度：0-31 ~ 99
    volatile uint8_t   net_operators;  // 运营商：0-没有网络 1-中国移动 2-中国联通 3-中国电信 0xFF-其他
    volatile uint8_t   net_reg;  // GSM注册状态：0-没有网络 1-本地 5-漫游
    volatile uint8_t   net_active;  // GPRS激活状态：0-没有激活 1-激活
    volatile uint8_t   net_cid; 
    volatile uint8_t   pdp_ip[NET_MOD_PDP_IP_LEN]; 
    volatile uint8_t   pdp_st;
    volatile uint8_t   loc_ip;  // 本地IP：0-无效 1-有效
    volatile uint8_t   net_ip[NET_MOD_LOC_IP_LEN];  // 本地IP地址
    volatile uint8_t   net_cfg;  // 0 网络基本配置未完成 1 网络基本配置完成
    volatile uint32_t  lte_tac;  // 基站号
    volatile uint32_t  lte_cell_id;  // 小区号
    volatile uint32_t  gsm_lac;   // 基站号
    volatile uint32_t  gsm_cell_id; // 小区号
} net_run_state_s;

//网络运行状态枚举类型---------------------------------------------------------
typedef enum
{
    MOD_STATE = 0,
    SIM_STATE,
    MOD_CCID,
    MOD_IMSI,
    MOD_IMEI,
    NET_SIGNAL,
    NET_OPERATORS,
    NER_REG,
    NET_ACTIVE,
    NET_CID,
    PDP_IP,
    LOC_IP,
    NET_IP,
    NET_CFG,
    LTE_TAC,
    LTE_CELL_ID,
    GSM_LAC,
    GSM_CELL_ID,
} net_run_type_e;

//网络接收消息数据结构----------------------------------------------------------
typedef struct
{
    volatile uint8_t            *pData;          // 数据指针
    volatile uint32_t            MsgType;        // 消息类型
    volatile uint32_t            MsgValidUntil;  // 消息有效至时间 tick单位
    volatile uint32_t            DateLen;        // 数据长度
} net_run_msg_s;

/****************************************************************************************
* NET数据结构体
******************************************************************************************/
typedef  struct
{
    uint16_t len;
    uint8_t  data[NET_RUN_REV_DATA_BUF_SIZE];
}net_run_buf_s;

//NET AT 命令------------------------------------------------------------------
typedef enum
{
    AT_CMD_NO_CMD = 0x00,
    AT_CMD_AT ,
} net_run_at_type_e;

/** ****************************************************************************
* @remarks       void net_at_res_callback(uint8_t *buf, uint16_t len)
* @brief         网络底层数据处理回调函数
* @param[in]     无
* @param[out]    *buf 接收数据源地址
* @param[out]    len 接收数据长度
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void net_at_res_callback(UINT8 *buf, UINT16 len);

/** ****************************************************************************
* @remarks       void net_sig_res_callback(GAPP_SIGNAL_ID_T sig, va_list arg)
* @brief         网络信号异步通信接口回调函数
* @param[in]     sig 信号状态
* @param[in]     arg 状态参数
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void net_sig_res_callback(GAPP_SIGNAL_ID_T sig, va_list arg);

/** ****************************************************************************
* @remarks       void net_port_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建网络底层数据处理任务
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void net_port_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       void net_module_run_port_init( void )
* @brief         网络模块运行功能接口初始化
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void net_module_run_port_init( void );

/** ****************************************************************************
* @remarks       void net_module_run_state_get( net_run_type_e state , void * data )
* @brief         查询网络注册的状态
* @param[in]     state 状态ID
* @param[out]    * data 指定状态的数据地址
* @return        无
* @attention     无
*******************************************************************************/
extern void net_module_run_state_get( net_run_type_e state , void * data );

/** ****************************************************************************
* @remarks       void net_module_run_state_set(net_run_type_e state , void * data)
* @brief         设置指定状态ID的数值
* @param[in]     state 指定设置的ID 
* @param[in]     * data 设置的数据
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void net_module_run_state_set(net_run_type_e state , void * data);

/** ****************************************************************************
* @remarks       void net_run_port_par_init( void )
* @brief         网络模块运行功能接口参数初始化
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void net_run_port_par_init( void );

/** ****************************************************************************
* @remarks       static uint32_t net_run_special_cmd_detection(net_run_msg_s *msg)
* @brief         和底层网络通信模块进行握手操作
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_at( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_sim_st( void )
* @brief         查询SIM卡状态
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_sim_st( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_ccid( void )
* @brief         获取模块的ICCID信息
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_ccid( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_imsi( void )
* @brief         获取模块的IMSI信息
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern  uint32_t net_run_get_imsi( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_imei( void )
* @brief         获取模块的IMEI信息
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_imei( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_csq( void )
* @brief         获取模块的信号质量
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_csq( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_reg_info( void )
* @brief         获取模块注册网络的信息
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_reg_info( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_set_pdp_active( uint8_t *apn , uint8_t *username , uint8_t *password )
* @brief         激活PDP
* @param[in]     *apn 地址
* @param[in]     *username 用户名
* @param[in]     *password 密码
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_set_pdp_active( uint8_t *apn , uint8_t *username , uint8_t *password );

/** ****************************************************************************
* @remarks       uint32_t net_run_set_pdp_release( void )
* @brief         去激活PDP
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_set_pdp_release( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_pdp_status( void )
* @brief         查询pdp的状态
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_pdp_status( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_reg_status( void )
* @brief         获取模块注册网络的信息
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_reg_status( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_check_reg_status( void )
* @brief         查询网络状态
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_check_reg_status( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_check_sim_status( void )
* @brief         查询SIM卡当前的状态
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_check_sim_status( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_csq_status( void )
* @brief         获取模块的信号质量状态
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_csq_status( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_reset_net_init( void )
* @brief         重新初始化网络
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern uint32_t net_run_reset_net_init( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_net_release( void )
* @brief         将网络去激活
* @param[in]     无
* @param[out]    无
* @return        pdPASS 成功  pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_net_release( void );

/** ****************************************************************************
* @remarks       uint32_t net_run_get_reg_info_status( void )
* @brief         获取模块注册网络的信息
* @param[in]     无
* @param[out]    无
* @return        pdTRUE 成功  pdFALSE 失败
* @attention     无
*******************************************************************************/
extern uint32_t net_run_get_reg_info_status( void );

#endif

